﻿using System;
using Sinacor.Infra.UI.Common;
using Sinacor.UI.Bovespa.Contabil.Communication.Bovespa.Contabil.ContaContabilFaturamento;
using Sinacor.Infra.UI.Security.Services;

namespace Sinacor.UI.Bovespa.Contabil.Communication
{
    /// <summary>
    /// Communication Class - ContaContabilFaturamento
    /// </summary>
    public class ContaContabilFaturamento : BaseCommunication
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="session">SessionInformation</param>
        public ContaContabilFaturamento(SessionInformation session) : base(session) { }

        #endregion

        #region AlterarContaContabilFaturamento

        /// <summary>
        /// Altera Conta Contábil Faturamento
        /// </summary>
        /// <param name="model">Model.ContaContabilFaturamento</param>
        public void AlterarContaContabilFaturamento(Model.ContaContabilFaturamento model)
        {            
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.AlterarContaContabilFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(model));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region AlterarContasContabeisFaturamento

        /// <summary>
        /// Altera Conta Contábil Faturamento
        /// </summary>
        /// <param name="modelList">Lista de objetos do tipo Model.ContaContabilFaturamento</param>        
        public void AlterarContasContabeisFaturamento(ModelCollection<Model.ContaContabilFaturamento> modelList)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.AlterarContasContabeisFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(modelList));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ConsultarContasContabeisFaturamento

        /// <summary>
        /// Consulta Contas Contábeis Faturamento
        /// </summary>
        /// <param name="parameter">Model.Parameter.FiltroContaContabilFaturamento</param>
        /// <returns>Lista de objetos do tipo Model.ContaContabilFaturamento</returns>
        public ModelCollection<Model.ContaContabilFaturamento> ConsultarContasContabeisFaturamento(Model.Parameter.FiltroContaContabilFaturamento parameter)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);

                    return new Translator.DataContractToModel.ContaContabilFaturamento().ToContaContabilFaturamento
                                (
                                    servico.ConsultarContasContabeisFaturamento
                                                (
                                                    new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroContaContabilFaturamentoRequest(parameter)
                                                )
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
                return null;
            }
        }

        #endregion

        #region ConsultarPlanosContas

        /// <summary>
        /// Consulta plano de contas
        /// </summary>
        /// <param name="request">Model.Parameter.FiltroPlanoConta</param>
        /// <returns>Lista de objetos do tipo Model.PlanoConta</returns>
        public ModelCollection<Model.PlanoConta> ConsultarPlanosContas(Model.Parameter.FiltroPlanoConta request)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);

                    return new Translator.DataContractToModel.ContaContabilFaturamento().ToPlanoConta
                                (
                                    servico.ConsultarPlanosContas
                                                (
                                                    new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroPlanoContaRequest(request)
                                                )
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
                return null;
            }
        }

        #endregion

        #region ExcluirContaContabilFaturamento

        /// <summary>
        /// Exclui Conta Contábil
        /// </summary>
        /// <param name="parameter">Model.Parameter.FiltroContaContabilFaturamentoChave</param>
        public void ExcluirContaContabilFaturamento(Model.Parameter.FiltroContaContabilFaturamentoChave parameter)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.ExcluirContaContabilFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroContaContabilFaturamentoChaveRequest(parameter));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ExcluirContasContabeisFaturamento

        /// <summary>
        /// Exclui Contas Contábeis
        /// </summary>
        /// <param name="parameterList">Lista de objetos do tipo Model.Parameter.FiltroContaContabilFaturamentoChave</param>
        public void ExcluirContasContabeisFaturamento(ModelCollection<Model.Parameter.FiltroContaContabilFaturamentoChave> parameterList)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.ExcluirContasContabeisFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroContaContabilFaturamentoChaveRequest(parameterList));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ExecutarTransacoesContaContabilFaturamento

        /// <summary>
        /// Executa transações Conta Contábil Faturamento
        /// </summary>
        /// <param name="inclusaoList">Lista de objetos do tipo Model.ContaContabilFaturamento</param>
        /// <param name="exclusaoList">Lista de objetos do tipo Model.Parameter.FiltroContaContabilFaturamentoChave</param>
        /// <param name="alteracaoList">Lista de objetos do tipo Model.ContaContabilFaturamento</param>
        public void ExecutarTransacoesContaContabilFaturamento(ModelCollection<Model.ContaContabilFaturamento> inclusaoList,
                                                               ModelCollection<Model.Parameter.FiltroContaContabilFaturamentoChave> exclusaoList,
                                                               ModelCollection<Model.ContaContabilFaturamento> alteracaoList)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.ExecutarTransacoesContaContabilFaturamento
                        (
                            new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroContaContabilFaturamentoChaveRequest(exclusaoList),
                            new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(inclusaoList),
                            new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(alteracaoList)
                        );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirContaContabilFaturamento

        /// <summary>
        /// Inclui Conta Contábil Faturamento
        /// </summary>
        /// <param name="model">Model.ContaContabilFaturamento</param>
        public void IncluirContaContabilFaturamento(Model.ContaContabilFaturamento model)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.IncluirContaContabilFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(model));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirContasContabeisFaturamento

        /// <summary>
        /// Inclui Contas Contábeis Faturamento
        /// </summary>
        /// <param name="modelList">Lista de objetos do tipo Model.ContaContabilFaturamento</param>
        public void IncluirContasContabeisFaturamento(ModelCollection<Model.ContaContabilFaturamento> modelList)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);
                    servico.IncluirContasContabeisFaturamento(new Translator.ModelToDataContract.ContaContabilFaturamento().ToContaContabilFaturamentoRequest(modelList));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ObterContaContabilFaturamento

        /// <summary>
        /// Obtem Conta Contábil Faturamento
        /// </summary>
        /// <param name="parameter">Model.Parameter.FiltroContaContabilFaturamento</param>
        /// <returns>ContaContabilFaturamento</returns>
        public Model.ContaContabilFaturamento ObterContaContabilFaturamento(Model.Parameter.FiltroContaContabilFaturamentoChave parameter)
        {
            try
            {
                using (ServiceInstance<IContaContabilFaturamento> service = new ServiceInstance<IContaContabilFaturamento>())
                {
                    IContaContabilFaturamento servico = service.TryGetInstance(this.Session);

                    return new Translator.DataContractToModel.ContaContabilFaturamento().ToContaContabilFaturamento
                                (
                                    servico.ObterContaContabilFaturamento
                                                (
                                                    new Translator.ModelToDataContract.ContaContabilFaturamento().ToFiltroContaContabilFaturamentoChaveRequest(parameter)
                                                )
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
                return null;
            }
        }

        #endregion
    }
}
